package com.atguigu.config;

import com.atguigu.bean.Color;
import com.atguigu.bean.ColorFactoryBean;
import com.atguigu.bean.Person;
import com.atguigu.bean.Red;
import com.atguigu.condition.LinuxCondition;
import com.atguigu.condition.MyInportSelector;
import com.atguigu.condition.WindowsCondition;
import org.springframework.context.annotation.*;

@Conditional({WindowsCondition.class})
@Configuration
@Import({Color.class, Red.class, MyInportSelector.class})   //直接将类引入到IOC容器,或者引入实现ImportSelector
public class MainConfig3 {


    /**
     * @Conditional: 按照一定的条件进行判断,满足条件给容器中注册bean,
     *  这个个注解可以加在类上,也可以加在方法上
     *
     * 如果系统是windows,给容器中注册("bill")
     * 如果系统是linux,给容器中注册("linux")
     */
    @Conditional({WindowsCondition.class})
    @Bean("bill")
    public Person person01() {
        return new Person("Bill Gates", 62);
    }

    @Conditional({LinuxCondition.class})
    @Bean("linus")
    public Person person02() {
        return new Person("linus", 48);
    }


    /**
     * 给容器中注册组件:
     *  1). 包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类]
     *  2). @Bean[导入的第三方包里面的组件]
     *  3). @Import[快速给容器中导入一个组件]
     *         1). @Import(要导入到容器中的组件);容器中就会自动注册这个组件。id默认是全类名
     *         2). ImportSelector: 返回需要导入的组件的全类名数组;
     *         3). ImportBeanDefinitionRegistrar: 手动注册bean到容器中
     *
     *  4). 使用Spring提供的FactoryBean(工厂Bean)
     *          1). 默认获取到的是工厂bean调用getObject创建的对象
     *          2). 要获取工厂bean本身,我们需要给id前面加一个&标识符
     *          3). 修改isSingleton()方法的返回布尔值,来切换该bean是单实例,还是多实例
     *
     */

    @Bean
    public ColorFactoryBean colorFactoryBean() {
        return new ColorFactoryBean();
    }

}
